package com.stox.ui.javafx.core.util;

import com.stox.design.Callback;

import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeTableView;

public class TreeTableUtil {

	public static <T> T search(TreeTableView<T> treeTableView,  Callback<T, Boolean> matcher, int start, boolean forward) {
		TreeItem<T> root = treeTableView.getRoot();
		TreeItem<T> startItem = start < 0 ? treeTableView.getRoot() :
			start > 0 ? TreeUtil.getLastLeaf(root) : treeTableView.getSelectionModel().getSelectedItem();
		TreeItem<T> treeItem = forward ? TreeUtil.nextTreeItem(startItem) : TreeUtil.previousTreeItem(startItem);
		do {
			if(null == treeItem) break;
			if(null == treeItem.getValue()) continue;
			if(matcher.execute(treeItem.getValue())) {
					select(treeTableView, treeItem);
					return treeItem.getValue();
			}
			treeItem = forward ? TreeUtil.nextTreeItem(treeItem) : TreeUtil.previousTreeItem(treeItem);
		}while(treeItem != null);
		return null;
	}
	
	public static <T> T getNextValue(TreeTableView<T> treeTableView, boolean forward){
		TreeItem<T> treeItem = treeTableView.getSelectionModel().getSelectedItem();
		if(null == treeItem) return null;
		treeItem = forward ? TreeUtil.nextTreeItem(treeItem) : TreeUtil.previousTreeItem(treeItem);
		if(null == treeItem) return null;
		select(treeTableView, treeItem);
		return treeItem.getValue();
	}
	
	public  static <T> void select(TreeTableView<T> treeTableView, TreeItem<T> treeItem){
		int row = treeTableView.getRow(treeItem);
		if(row <= 0) return;
		TreeUtil.expand(treeItem);
		treeTableView.scrollTo(row);
		treeTableView.getSelectionModel().clearAndSelect(row);
	}
	
}
